package com.kinyx.framework.db.sentence.str;

import java.util.ArrayList;
import java.util.List;

import com.kinyx.framework.annotation.assist.Tester;
import com.kinyx.framework.bean.StringFormatter;
import com.kinyx.framework.db.sentence.defines.InsertSentence;
import com.kinyx.framework.utils.KListUtils;

import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;

/**
 * 新增语句
 */
@RequiredArgsConstructor(access = AccessLevel.PACKAGE)
@Tester("com.kinyx.framework.db.sentence.str.demo.insert.INSERT_Tester")
public class INSERT extends _CRUD implements InsertSentence {

	/** 表子句 */
	private final String table;

	// ================================================================= values ================================================================= //
	/** 列子句列表 */
	private final List<ColumnParam> columns = new ArrayList<>();

	/**
	 * 新增VALUES子句
	 * @param column 列
	 * @param param 参数
	 * @return 本对象
	 */
	public INSERT values(final String column, final Object param) {
		this.columns.add(new ColumnParam(column, param));
		return this;
	}

	// ================================================================= 实现方法 ================================================================= //
	@Override
	public String getSentence() {
		return StringFormatter.of()//
				.x("INSERT INTO %s", this.table)//
				.x(" (%s)", () -> {
					if (INSERT.this.columns.isEmpty()) { return StringFormatter.Type.Ignore; }
					return KListUtils.join(this.columns, ", ", (column, index) -> { return column.getColumn(); });
				})//
				.x(" VALUES (%s)", () -> {
					if (INSERT.this.columns.isEmpty()) { return StringFormatter.Type.Ignore; }
					return KListUtils.join(this.columns, ", ", (column, index) -> { return "?"; });
				})//
				.format();
	}

	@Override
	public List<Object> getParams() {
		final List<Object> params = new ArrayList<>();
		// columns params
		this.columns.forEach(column -> params.add(column.getParam()));
		return params;
	}

}
